import errorCode from "./errorCode";

// 此处第二个参数vm，就是我们在页面使用的this，你可以通过vm获取vuex等操作
const install = (Vue, vm) => {
  // 通用请求头设定
  const ajaxHeader = "x-ajax";
  const sessionIdHeader = "Authorization";
  const skipToken = "isToken";
  const rememberMeHeader = "x-remember";

  // 请求参数默认配置
  Vue.prototype.$u.http.setConfig({
    baseUrl: vm.vuexConfig.baseUrl,
    originalData: true,
    header: {},
  });

  // 请求拦截，配置Token等参数
  Vue.prototype.$u.http.interceptor.request = (req) => {
    if (!req.header) {
      req.header = [];
    }

    // 默认指定返回 JSON 数据
    if (!req.header[ajaxHeader]) {
      req.header[ajaxHeader] = "json";
    }

    // 如果包含 skipToken,则跳过携带token
	const token = uni.getStorageSync("Admin-Token")
    if (!req.header[skipToken] && token) {
      req.header[sessionIdHeader] = "Bearer " + token;
    }


    // 为节省流量，记住我数据不是每次都发送的，当会话失效后，尝试重试登录 ThinkGem
    if (!req.header[rememberMeHeader] && vm.vuexRemember && req.remember) {
      req.header[rememberMeHeader] = vm.vuexRemember;
      req.remember = false;
    }

    return req;
  };

  // 响应拦截，判断状态码是否通过
  Vue.prototype.$u.http.interceptor.response = async (res, req) => {
    const status = Number(res.statusCode) || 200;
    const message = res.data.msg || errorCode[status] || errorCode["default"];

    // 后台定义 401 针对令牌过去的特殊响应码
    if (status === 401 || status === 424) {
      vm.$u.toast("令牌过期，请重新登录");
      //清空存储信息
      vm.$u.vuex("vuexToken", "");
      vm.$u.vuex("vuexUser", {});

      setTimeout(() => {
        uni.reLaunch({
          url: "/pages/sys/login/index",
        });
      }, 500);
      return;
    }

    if (status !== 200 || res.data.code === 1) {
      vm.$u.toast(message);
      return Promise.reject(new Error(message, status));
    }

    return res.data;
  };

  // 封装 get text 请求
  vm.$u.getText = (url, data = {}, header = {}) => {
    return vm.$u.http.request({
      dataType: "text",
      method: "GET",
      url,
      header,
      data,
    });
  };

  // 封装 post json 请求
  vm.$u.postJson = (url, data = {}, header = {}) => {
    header["content-type"] = "application/json";
    return vm.$u.http.request({
      url,
      method: "POST",
      header,
      data,
    });
  };
};

export default {
  install,
};
